package gbench.appdemo.myworld.economy.strategy;

import java.util.List;
import java.util.stream.Stream;

import gbench.appdemo.myworld.economy.demand.IDemand;
import gbench.appdemo.myworld.economy.supply.IProduct;
import gbench.appdemo.myworld.market.SimpleMarket;
import gbench.appdemo.myworld.market.commodity.Commodity;
import gbench.common.tree.LittleTree.Tuple2;

/**
 * 行为逻辑模型
 * @author gbench
 *
 */
public interface IBehaviorModel {

    /**
     * 为需求狗仔产品概念,设计产品概念：
     * @param demand 需求(想法)的载体
     * @return 产品创意的生成
     */
    public Tuple2<IProduct, List<IDemand>> design(IDemand... demands);

    /**
     * 获取商品集合：为产品在市场中 搜集响应的商品：<br>
     * market 对应于 客观的物质条件: product概念 反 作用于  物质 market 产生新的 物质:商品对象。
     * 
     * @param product 产品概念
     * @param market 客观物质条件
     * @return
     */
    public Stream<Commodity> getCommodities(IProduct product, SimpleMarket<Commodity> market);

    /**
     * 提出目标,根据需求设计出目标
     * 
     * @param demand
     * @return 目标产品
     */
    public IProduct getObjective(IDemand demand);

    /**
     * 为individual 思考一个主意
     * 在外界 event(物质条件) 刺激主观意识 启发出一个 想法主意。
     * 在客观位置条件 commodities 的情况下 表达需求。
     * 
     * @param ideaDomain 思考域
     * @return Idea
     */
    public Idea getIdea(IdeaDomain ideaDomain,EconomyEvent event);

}
